import time

import pytest
import requests

from api.reg_login_api import RegLoginApi
from common.utils import common_assert, clear_user_info, read_json


class TestRegLogin(object):
    def setup_class(self):
        # 调用封装的用户信息初始化的方法
        clear_user_info()

    def setup(self):
        # 1、创建session对象
        ses = requests.session()
        # 2、实例化封装接口请求的类，获取类的对象
        self.reg = RegLoginApi(ses)

    # 获取图片验证码测试用例
    @pytest.mark.parametrize('r,exp_status_code', read_json('reg_login_data', 'img_verify_code'))
    def test01_img_verify_code(self, r, exp_status_code):
        # 1、调用实例化类的对象，获取注册图片验证码接口请求的方法，拿到该接口的响应数据
        resp = self.reg.get_img_verify_code(r)
        # 2、断言
        assert exp_status_code == resp.status_code

    # 获取短信验证码测试用例
    @pytest.mark.parametrize('phone,imgVerifyCode,exp_status,description',
                             read_json('reg_login_data', 'phone_verify_code'))
    def test02_phone_verify_code(self, phone, imgVerifyCode, exp_status, description):
        # 1、调用实例化类的对象，获取注册图片验证码接口请求的方法
        self.reg.get_img_verify_code(0.1333545646)
        # 2、调用实例化类的对象，获取短信验证码接口请求的方法，拿到该接口的响应数据
        resp = self.reg.get_phone_verify_code(phone, imgVerifyCode)
        # 3、断言
        # assert 200 == resp.status_code
        # assert '成功' in resp.json().get('description')
        # assert 200 == resp.json().get('status')
        common_assert(resp, description, exp_status)

    # 注册测试用例
    @pytest.mark.parametrize('form_dict,exp_status,description', read_json('reg_login_data', 'user_register'))
    def test03_register(self, form_dict, exp_status, description):
        # 1、定义测试数数据
        # 2、调用实例化类的对象，获取注册图片验证码接口请求的方法
        self.reg.get_img_verify_code(0.1333545646)
        # 3、调用实例化类的对象，获取短信验证码接口请求的方法
        self.reg.get_phone_verify_code(form_dict.get('phone'), 8888)
        # 4、调用实例化类的对象，获取注册接口请求的方法，拿到该接口的响应数据
        resp = self.reg.user_register(form_dict)
        # 5、断言
        # assert 200 == resp.status_code
        # assert '成功' in resp.json().get('description')
        # assert 200 == resp.json().get('status')
        common_assert(resp, description, exp_status)

    # 登录测试用例
    @pytest.mark.parametrize('mobile,password,exp_status,description', read_json('reg_login_data', 'user_login'))
    def test04_user_login(self, mobile, password, exp_status, description):
        # 1、调用实例化类的对象，获取登录接口请求的方法，拿到该接口的响应数据
        resp = self.reg.user_login(mobile, password)
        # # 2、断言
        # assert 200 == resp.status_code
        # assert '成功' in resp.json().get('description')
        # assert 200 == resp.json().get('status')
        common_assert(resp, description, exp_status)

    # 登录密码错误校验--测试用例
    @pytest.mark.skip
    def test05_user_login(self):
        # 登录密码错误1次
        resp_1 = self.reg.user_login('18743264321', '123')
        common_assert(resp_1, '密码错误1次', 100)
        # 登录密码错误2次
        resp_2 = self.reg.user_login('18743264321', '123')
        common_assert(resp_2, '密码错误2次', 100)
        # 密码错误3次，账号被锁定
        resp_3 = self.reg.user_login('18743264321', '123')
        common_assert(resp_3, '账号已被锁定', 100)
        # 被锁定后，等待60S重新登录成功
        time.sleep(60)
        resp_4 = self.reg.user_login('18743264321', 'qqq123')
        common_assert(resp_4, '登录成功', 200)
